package com.mauriciobustamante.pruebapds;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.mauriciobustamante.modelo.Accion;
import com.mauriciobustamante.modelo.Prestacion;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;

public class BuscarPaciente extends Activity {

	private String URL = "http://10.0.2.2:8080/PruebaPDS/services/Clinica";
	private String NAMESPACE = "http://biz.pds.mauriciobustamante.com";
;
	private Spinner prestacion;
	private EditText fechaDesde;
	private EditText fechaHasta;
	
	private Prestacion[] prestaciones;
	
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_buscar_paciente);
        
        this.prestacion = (Spinner) findViewById(R.id.spinnerPrestacion);
        this.fechaDesde = (EditText) findViewById(R.id.editTextFechaDesde);
        this.fechaHasta = (EditText) findViewById(R.id.editTextFechaHasta);
        
        new ObtenerPrestacionesBackground().execute();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_buscar_paciente, menu);
        return true;
    }
    
    
    public void buscarPacientes(View v){
		
		// obtener datos
		
		int idPrestacion = prestaciones[prestacion.getSelectedItemPosition()].getId();

		
		String desde = this.fechaDesde.getText().toString();
    	String hasta = this.fechaHasta.getText().toString();
		
    	
    	if(idPrestacion == -1 && (desde == null || desde.equalsIgnoreCase("")) && (desde == null || desde.equalsIgnoreCase("")) ){
    		
    		// faltan datos
    		Toast.makeText(BuscarPaciente.this, "Debe llevar al menos un dato", Toast.LENGTH_LONG).show();
    		return;
    	}
    	
    	
		JsonObject json = new JsonObject();
		if(idPrestacion != -1){
			json.addProperty("prestacionid", idPrestacion);
		}
		
    	if( desde != null && !desde.equalsIgnoreCase("") ){
    		json.addProperty("fechadesde", desde);
    	}
    	
    	if( hasta != null && !hasta.equalsIgnoreCase("") ){
    		json.addProperty("fechahasta", hasta);
    	}
    	
    	new EnviarInformacionBackground().execute("getPacientesByPrestacion",json.toString());
		
    }
    
    
    public void procesarRespuesta(String respuesta){
    	JsonParser parser = new JsonParser();
    	JsonObject json = (JsonObject) parser.parse(respuesta);
    	
    	if(!json.has("respuesta") || !json.has("resultado")){
    		Toast.makeText(BuscarPaciente.this, "Error en la respuesta obtenida", Toast.LENGTH_LONG).show();
    		return;
    	}
    	
    	// error
    	if(json.get("resultado").getAsInt() == 0){
    		Toast.makeText(BuscarPaciente.this, "Error: "  + json.get("respuesta").getAsString(), Toast.LENGTH_LONG).show();
    		return;
    	}    	
    	
    	JsonArray pacientes = json.get("respuesta").getAsJsonArray();
    	String msj = "";
    	
    	for (JsonElement elem : pacientes) {
    		JsonObject el = (JsonObject) elem;
			msj += 	el.get("nombre").getAsString() + "   ";
		}
    	
    	if(msj.equalsIgnoreCase("")){
    		msj = "No existen pacientes con los parametros indicados";
    	}
    	
    	AlertDialog.Builder builder = new AlertDialog.Builder(
    			BuscarPaciente.this);
        builder.setCancelable(true);
        builder.setTitle("Pacientes");
        builder.setMessage(msj);
        builder.setInverseBackgroundForced(true);
        builder.setPositiveButton("Yes",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,
                            int which) {
                        dialog.dismiss();
                    }
                });
        AlertDialog alert = builder.create();
        alert.show();
    	
    	
    }
    
    class EnviarInformacionBackground extends AsyncTask<String, Void, String>{
		
		private ProgressDialog progressDialog;

		@Override
		protected void onPreExecute() {
    		progressDialog = ProgressDialog.show(
    				BuscarPaciente.this,
    				"Paciente", 
    				"Espere mientras se procesa la peticion...", 
    				true);
			super.onPreExecute();
		}
		
		// param[0] = nombre Metodo
	    // param[1] = json
		@Override
		protected String doInBackground(String... params) {

			String resultado = "";
			String METHOD_NAME = params[0];
			String SOAP_ACTION = Accion.NAMESPACE + "/" +METHOD_NAME;
			SoapObject request = new SoapObject(Accion.NAMESPACE, METHOD_NAME);
			SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
			soapEnvelope.dotNet = true;
			soapEnvelope.implicitTypes = true;
			soapEnvelope.setOutputSoapObject(request);
			request.addProperty("json", params[1]);
			HttpTransportSE aht = new HttpTransportSE(Accion.URL);

			try {
				aht.call(SOAP_ACTION, soapEnvelope);
				SoapPrimitive resultString = (SoapPrimitive)soapEnvelope.getResponse();
				resultado = resultString.toString();

			} catch (IOException e) {
				e.printStackTrace();
			} catch (XmlPullParserException e) {
				e.printStackTrace();
			}

			return resultado;
		}

		@Override
		protected void onPostExecute(String result) {
			super.onPostExecute(result);
			BuscarPaciente.this.procesarRespuesta(result);
			progressDialog.dismiss();
		}
	}    
    
    class ObtenerPrestacionesBackground extends AsyncTask<Void, Void, Prestacion[]	>{
		
		private ProgressDialog progressDialog;

		@Override
		protected void onPreExecute() {
    		progressDialog = ProgressDialog.show(
    				BuscarPaciente.this,
    				"Obteniendo informacion", 
    				"Espere mientras se obtienen las prestaciones...", 
    				true);
			super.onPreExecute();
		}

		protected Prestacion[] doInBackground(Void... params) {
		
			Prestacion[] resultado = null;
			String METHOD_NAME = "getPrestaciones";
			String SOAP_ACTION = NAMESPACE +"/" +METHOD_NAME;
			SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
			SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
			soapEnvelope.dotNet = true;
			soapEnvelope.implicitTypes = true;
			soapEnvelope.setOutputSoapObject(request);

			HttpTransportSE aht = new HttpTransportSE(URL);

			try {
				aht.call(SOAP_ACTION, soapEnvelope);
				SoapPrimitive resultString = (SoapPrimitive)soapEnvelope.getResponse();
				String resultadoJSON = resultString.toString();
				
				JsonParser parser = new JsonParser();
		    	JsonObject json = (JsonObject) parser.parse(resultadoJSON);
		    	
				JsonArray prestaciones = json.get("respuesta").getAsJsonArray();	
				resultado = new Prestacion[prestaciones.size()];
					for(int i=0; i < prestaciones.size(); i++){
						
						JsonObject prest = (JsonObject) prestaciones.get(i).getAsJsonObject();
						Prestacion p = new Prestacion(prest.get("id").getAsInt(), prest.get("nombre").getAsString());
						resultado[i] = p;
					}
				
			} catch (IOException e) {
				e.printStackTrace();
			} catch (XmlPullParserException e) {
				e.printStackTrace();
			}

			return resultado;
		}

		@Override
		protected void onPostExecute(Prestacion[] result) {
			super.onPostExecute(result);
			
			String[] nombres = new String[result.length];
			BuscarPaciente.this.prestaciones = result;
			
			for(int i=0; i < result.length; i++){
				Prestacion p = result[i];
				nombres[i] = p.getNombre();
			}
			
			ArrayAdapter aa = new ArrayAdapter(BuscarPaciente.this,android.R.layout.simple_spinner_item, nombres);
			
			BuscarPaciente.this.prestacion.setAdapter(aa);
			progressDialog.dismiss();
		}

	}
}
